# Python模块和包使用演示

# 1. 模块的基本使用
# 假设我们有一个math_operations.py模块
"""
- 1.相对导入使用点号(.)表示当前目录，双点号(..)表示父目录
- 2.
只能在包内使用，不能在顶级脚本中使用
- 3.
示例：

- from . import module - 导入同目录下的模块
- from ..subpackage import module - 导入父目录下子包中的模块
- from ...deep import something - 导入祖父目录下的模块(两个点表示父目录)
- 4.
相对导入常用于包内部模块之间的相互引用
- 5.
使用相对导入时，文件必须作为模块运行(python -m package.module)，不能直接运行(python module.py)
"""

"""
# math_operations.py内容:
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b
"""

# 导入整个模块
import math_operations
print(math_operations.add(5, 3))  # 输出: 8

# 导入特定函数
from math_operations import subtract
print(subtract(5, 3))  # 输出: 2

# 给模块起别名
import math_operations as mo
print(mo.add(2, 2))  # 输出: 4

# 2. 包的基本使用
"""
项目结构:
my_package/
    __init__.py
    string_utils.py
    math/
        __init__.py
        advanced.py
"""

# 从包中导入模块
from my_package import string_utils
print(string_utils.reverse('hello'))  # 假设reverse函数存在

# 从子包中导入
from my_package.math import advanced
print(advanced.sqrt(16))  # 假设sqrt函数存在

# 3. 相对导入演示
"""
在my_package/math/advanced.py中使用相对导入:
# advanced.py内容:
from . import basic_operations  # 导入同目录下的basic_operations模块
from .. import string_utils    # 导入父目录下的string_utils模块
"""

# 4. __init__.py的作用
"""
# my_package/__init__.py内容:
from .string_utils import reverse  # 当导入包时自动导入reverse函数

# 使用:
import my_package
print(my_package.reverse('abc'))  # 可以直接使用
"""

# 5. __all__变量控制导入
"""
# math_operations.py中添加:
__all__ = ['add']  # 只允许导入add函数

# 使用:
from math_operations import *  # 只会导入add函数
"""

# 6. 查看模块内容
dir(math_operations)  # 查看模块所有属性
help(math_operations)  # 查看模块文档

# 7. 模块搜索路径
import sys
print(sys.path)  # 查看Python查找模块的路径

# 8. 添加自定义路径
import os
sys.path.append(os.path.join(os.path.dirname(__file__), 'my_modules'))